/******************************************************************************
 *      Mestrado em Ciência da Computação - UFMS
 *		Redes de Computadores - Prof. Dr. Ronaldo Alves Ferreira
 *		Alunos: Geraldo Landre, Marcel Tolentino, Vinícius Bueno
 *****************************************************************************/
 
#ifndef SOCKET_H
#define SOCKET_H

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/wait.h>
#include <sys/types.h>	
#include <sys/socket.h>	
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#include <unistd.h>


/* ################### SOCKETS #################################### */

/*
	Abre um socket a partir de uma estrutura addrinfo.
	Retorna o File Descriptor do socket aberto.
	Em caso de erro, escreve a 'errormsg' em stderr		
	@param struct addrinfo* res: estrutura base para o socket
	@param char* errormsg: mensagem a ser impressa no stderr em caso de erro
	*/
int sock_open(struct addrinfo*);

/*
	Permite que um socket seja utilizado a menos que o mesmo já esteja
	ativamente escutando em alguma porta.
	Evita o erro "Address already in use" quando o servidor é restartado
	@param int sockfd: fd do socket a ser setado										*/
int sock_reuseaddr(int);

/*
	Fecha o socket cujo fd foi passado por parâmetro. Utiliza o label
	para impressão de mensagens de debug
	@param int sockfd:	fd do socket a ser fechado
	@param char* label:	usado para impressão de debug
*/
void sock_close(int, char*);

#endif
